package com.sp.reflection.class_;

import com.sp.Car;

/**
 * 演示得到Class对象的各种方式
 */
public class GetClass_ {
    public static void main(String[] args) throws ClassNotFoundException {
        //1. 已知一个类的全类名, 且该类在类路径下, 可通过Class类的静态方法forName()获取, 可能抛出ClassNotFoundException
        //多用于配置文件,读取类全路径, 加载类
        String classAllPath = "com.sp.Car";//通过读取配置文件获取
        Class<?> cls1 = Class.forName(classAllPath);
        System.out.println(cls1);

        //2. 已知具体的类, 通过类的class获取, 该方式最为安全可靠, 程序性能最好
        Class<Car> cls2 = Car.class;
        System.out.println(cls2);

        //3. 对象.getClass(), 应用场景, 有对象实例
        Car car = new Car();
        Class cls3 = car.getClass();
        System.out.println(cls3);

        //4. 通过 类加载器[一共有4种] 来获取到类的Class对象
        //(1) 先得到类加载器
        ClassLoader classLoader = car.getClass().getClassLoader();
        //(2) 通过类加载器得到Class对象
        Class<?> cls4 = classLoader.loadClass(classAllPath);


        //cls1 cls2 cls3 cls4 其实是同一个对象
        System.out.println(cls1.hashCode());
        System.out.println(cls2.hashCode());
        System.out.println(cls3.hashCode());
        System.out.println(cls4.hashCode());


        //5. 基本数据类型(int, char, boolean, float, double, byte, long, short) 按照一下方式得到Class类对象
        Class<Integer> integerClass = int.class;
        Class<Character> characterClass = char.class;
        Class<Boolean> booleanClass = boolean.class;
        System.out.println(integerClass);


        //6. 基本数据类型对应的包装类, 可以通过 .TYPE 得到Class类对象
        Class<Integer> type1 = Integer.TYPE;
        Class<Character> type2 = Character.TYPE;
        System.out.println(type1);

        System.out.println(integerClass.hashCode());
        System.out.println(type1.hashCode());
    }
}
